#include <cstdlib>
#include <iostream>
using namespace std;

void FillRand (int A[], int n);
void SelectSort (int A[], int n);
void RunNumber (int A[], int n);
void CheckSum (int A[], int n);
void FillInc (int A[], int n);
void FillDec (int A[], int n);

int main(){
    int n = 100;
    int A[n];
    //int M, C;
    
    //рандомный
    srand(time(NULL));
    cout << "Рандомный массив: " << endl;
    FillRand(A, n);
    for (int i = 0; i < n; i++){
        cout << A[i] << " ";
    }
    cout << endl;
    RunNumber(A, n);
    CheckSum(A, n);
    SelectSort (A, n);
    cout << "Теоретическое количество пересылок: " << 3*(n-1) << endl;
    cout << "Теоретическое количество сравнений: " << (n * n - n) / 2 << endl << endl;
    for (int i = 0; i < n; i++){
        cout << A[i] << " ";
    }
    cout << endl;
    RunNumber(A, n);
    CheckSum(A, n);
    
    
    //возрастающий
    cout << endl << "Возрастающий массив: " << endl;
    FillInc(A, n);
    for (int i = 0; i < n; i++){
        cout << A[i] << " ";
    }
    cout << endl;
    RunNumber(A, n);
    CheckSum(A, n);
    SelectSort (A, n);
    cout << "Теоретическое количество пересылок: " << 3*(n-1) << endl;
    cout << "Теоретическое количество сравнений: " << (n*n-n) / 2 << endl;
    for (int i = 0; i < n; i++){
        cout << A[i] << " ";
    }
    cout << endl;
    RunNumber(A, n);
    CheckSum(A, n);
    
    //убывающий
    cout << endl << "Убывающий массив: " << endl;
    FillDec(A, n);
    for (int i = 0; i < n; i++){
        cout << A[i] << " ";
    }
    cout << endl;
    RunNumber(A, n);
    CheckSum(A, n);
    SelectSort (A, n);
    cout << "Теоретическое количество пересылок: " << 3*(n-1) << endl;
    cout << "Теоретическое количество сравнений: " << (n*n-n) / 2 << endl;
    for (int i = 0; i < n; i++){
        cout << A[i] << " ";
    }
    cout << endl;
    RunNumber(A, n);
    CheckSum(A, n);

}

void FillRand (int A[], int n) {
    for (int i = 0; i < n; i++) {
        A[i] = rand()%1000;
    }
}

void SelectSort(int A[], int n) {
    int k = 0, temp, number1 = 0, number2 = 0;
    for (int i = 0; i < n - 1; i++) {
        k = i;
        for (int j = i + 1; j < n; j++) {
            number2++;
            if (A[j] < A[k]) {
                k = j;
            }
        }
        if (k != i) {  // Добавлено условие, чтобы избежать лишних обменов
            swap(A[i], A[k]);
            number1++;  // Увеличиваем number1 только при фактическом обмене
        }
    }
    cout << endl << "Кол-во пересылок по факту: " << number1 << endl << "Кол-во сравнений по факту: " << number2 << endl;
}


void RunNumber (int A[], int n) {
    int r = 1;
    for (int i = 1; i < n; i++) {
        if (A[i-1] > A[i]) r++;
    }
    cout << "Серий: " << r << endl;
}

void CheckSum (int A[], int n) {
    long int sum = 0;
    for (int i = 0; i < n; i++) {
        sum += A[i];
    }
    cout << "Сумма: " << sum << endl;
}

void FillInc (int A[], int n) {
    for (int i = 0; i < n; i++) {
        A[i] = i+1;
    }
}

void FillDec (int A[], int n) {
    for (int i = 0; i < n; i++) {
        A[i] = n-i;
    }
}
